热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

请看|差别_Android6.0运行时权限处理解析

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Android 6.0 运行时权限处理解析相关的知识,希望对你有一定的参考价值。 1.概述   不知道大家有没有遇到过这种情况,开发a

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Android 6.0 运行时权限处理解析相关的知识,希望对你有一定的参考价值。



1.概述



  不知道大家有没有遇到过这种情况,开发app的时候发现自己手机选择照片是正常的,测试那边的一台手机怎么搞都不行,然后查看版本之后才发现是6.0的手机。
  
  随着Android 6.0 7.0 我们开发者所要应对的主要就是新版本SDK带来的一些变化,既然是程序员那么我们肯定就特别关注开发部分的变化,其中之一就是权限处理。那么在6.0及以上版本我们的危险权限都需要在运行的时候去申请,之前都是在清单文件中配置即可,现在就不行了需要加代码申请。
  

附视频讲解地址:http://pan.baidu.com/s/1bpqqkGn


2.运行时权限的检测 



  2.1. android6.0之后的权限差别
  
  对于6.0以下的权限及在安装的时候,根据权限声明产生一个权限列表,用户只有在同意之后才能完成app的安装。而在6.0以后,我们可以直接安装,当app需要权限是会给予用户提示用户可以选择同意和拒绝。

新的权限机制更好的保护了用户的隐私,Google将权限分为两类,一类是Normal Permissions,这类权限一般不涉及用户隐私,是不需要用户进行授权的,比如访问网络等;另一类是Dangerous Permission,一般是涉及到用户隐私的,需要用户进行授权,比如读取sdcard、打电话等等。

看几个Normal Permissions:

INTERNET
GET_PACKAGE_SIZE
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
CHANGE_WIFI_STATE
VIBRATE

看几组Dangerous Permissions:

group:android.permission-group.CONTACTS
permission:android.permission.WRITE_CONTACTS
permission:android.permission.GET_ACCOUNTS
permission:android.permission.READ_CONTACTS
group:android.permission-group.PHONE
permission:android.permission.READ_CALL_LOG
permission:android.permission.READ_PHONE_STATE
permission:android.permission.CALL_PHONE
permission:android.permission.WRITE_CALL_LOG
permission:android.permission.USE_SIP
permission:android.permission.PROCESS_OUTGOING_CALLS
group:android.permission-group.CAMERA
permission:android.permission.CAMERA
group:android.permission-group.STORAGE
permission:android.permission.READ_EXTERNAL_STORAGE
permission:android.permission.WRITE_EXTERNAL_STORAGE

  你会发现dangerous permissions,危险权限都是一组一组的,这是个什么概念呢?又或是有什么用呢?如果app运行在Android 6.x的机器上,对于授权机制是这样的。如果你申请某个危险的权限,假设你的app早已被用户授权了同一组的某个危险权限,那么系统会立即授权,而不需要用户去点击授权。比如你的app对READ_CONTACTS已经授权了,当你的app申请WRITE_CONTACTS时,系统会直接授权通过。此外,对于申请时弹出的dialog上面的文本说明也是对整个权限组的说明,而不是单个权限(ps:这个dialog是不能进行定制的)。
  
  
2.2. 代码变化

2.2.1.之前写都是老套路直接上代码(已电话拨打为例):

Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + mPhoneNumber);
intent.setData(data);
startActivity(intent);

2.2.2.但是现在不行啦,我们需要去检测该权限有没有背用户授予过,如果没有则需要申请打电话权限,如果有授予过可以直接拨打电话。
ContextCompat.checkSelfPermission:检测权限
ActivityCompat.requestPermissions:申请权限

// ContextCompat.checkSelfPermission()
// 方法返回值为PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。
// 当返回GRANTED表示有该权限,DENIED表示没有该权限。
if(ContextCompat.checkSelfPermission(this,Manifest.permission.CALL_PHONE)
!= PackageManager.PERMISSION_GRANTED)
// 没有该权限 申请打电话权限
// 三个参数 第一个参数是 Context , 第二个参数是用户需要申请的权限字符串数组,第三个参数是请求码 主要用来处理用户选择的返回结果
ActivityCompat.requestPermissions(this,new String[]"Manifest.permission.CALL_PHONE",CALL_PHONE_REQUEST_CODE);
else
// 有该权限,直接打电话
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + 137XXXXXXXX);
intent.setData(data);
startActivity(intent);

2.2.3. 处理回调
  如果用户同意或是拒绝那么会回调onRequestPermissionsResult(),别看错了不是onActivityResult()

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
if(requestCode == CALL_PHONE_REQUEST_CODE)
if (grantResults !=null&&grantResults[0] == PackageManager.PERMISSION_GRANTED)
// Permission Granted 通过 打电话
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + 137XXXXXXXX);
intent.setData(data);
startActivity(intent);
else
// Permission Denied 被拒绝
Toast.makeText(this,"权限被拒绝了",Toast.LENGTH_SHORT).show();


2.2.4. 简单的例子

public class MainActivity extends AppCompatActivity
// 打电话权限申请的请求码
private static final int CALL_PHONE_REQUEST_CODE = 0x0011;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

public void phoneClick(View view)
if(ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)
!= PackageManager.PERMISSION_GRANTED)
Toast.makeText(this, "申请权限", Toast.LENGTH_SHORT).show();
ActivityCompat.requestPermissions(this,
new String[]"Manifest.permission.CALL_PHONE", CALL_PHONE_REQUEST_CODE);
else
callPhone();


/**
* 拨打电话
**/

private void callPhone()
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:147****2514");
intent.setData(data);
startActivity(intent);

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == CALL_PHONE_REQUEST_CODE)
if (grantResults !=null&&grantResults[0] == PackageManager.PERMISSION_GRANTED)
// Permission Granted
callPhone();
else
// Permission Denied
Toast.makeText(this,"权限被拒绝了",Toast.LENGTH_SHORT).show();



  上面就是6.0以上的版本运行时权限处理,但是我们会发现一个问题,如果都得这么干那需要些多少代码量?下面我们就利用反射加注解的方式封装我们的权限处理框架,请看这里Android 6.0 运行时权限封装框架


  
  项目的代码不能够发给大家,里面涉及到后台接口以及数据加密,如果大家感兴趣可以看一下我录的视频:http://pan.baidu.com/s/1bpqqkGn 。


推荐阅读
  • 在创建新的Android项目时,您可能会遇到aapt错误,提示无法打开libstdc++.so.6共享对象文件。本文将探讨该问题的原因及解决方案。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 作为一名新手,您可能会在初次尝试使用Eclipse进行Struts开发时遇到一些挑战。本文将为您提供详细的指导和解决方案,帮助您克服常见的配置和操作难题。 ... [详细]
  • 本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文介绍了在使用Visual Studio 2015进行项目开发时,遇到类向导弹出“异常来自 HRESULT:0x8CE0000B”错误的解决方案。通过具体步骤和实践经验,帮助开发者快速排查并解决问题。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • 本文详细介绍了如何准备和安装 Eclipse 开发环境及其相关插件,包括 JDK、Tomcat、Struts 等组件的安装步骤及配置方法。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
author-avatar
李林1108_965
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有